#include <bits/stdc++.h>

#define eb emplace_back
#define fi first
#define se second
#define in read<int>()
#define lin read<ll>()
#define rep(i, x, y) for(int i = (x); i <= (y); i++)
#define per(i, x, y) for(int i = (x); i >= (y); i--)

using namespace std;

using ll = long long;
using pii = pair < int, int >;
using vec = vector < int >;

template < typename T > T read() {
	T x = 0; bool f = 0; char ch = getchar();
	while(!isdigit(ch)) f |= ch == '-', ch = getchar();
	while(isdigit(ch)) x = x * 10 + (ch ^ 48), ch = getchar();
	return f ? -x : x;
}

template < typename T > void chkmax(T &x, const T &y) { x = x > y ? x : y; }
template < typename T > void chkmin(T &x, const T &y) { x = x < y ? x : y; }

const int N = 1e5 + 10;
const int K = 18;

int n, m, Q;

namespace seg {
	const int N = 1e7 + 10;
	int ch[N][2], val[N], ndn;
	void ins(int &x, int pos, int l = 1, int r = n) {
		int t = ++ndn; val[t] = val[x] + 1; ch[t][0] = ch[x][0]; ch[t][1] = ch[x][1]; x = t; if(l == r) return; int mid = l + r >> 1;
		if(pos <= mid) ins(ch[x][0], pos, l, mid); else ins(ch[x][1], pos, mid + 1, r);
	}
	int qkth(int x, int y, int k, int l = 1, int r = n) {
		if(l == r) return l; int mid = l + r >> 1;
		if(val[ch[y][0]] - val[ch[x][0]] < k) return qkth(ch[x][1], ch[y][1], k - (val[ch[y][0]] - val[ch[x][0]]), mid + 1, r);
		else return qkth(ch[x][0], ch[y][0], k, l, mid);
	}
}

namespace ori {
	vec G[N];
	int dfn[N], fa[K + 1][N], R[N], dep[N], tim, ind[N], rt[N], siz[N];
	void dfs(int x, int p) {
		siz[x] = 1; fa[0][x] = p; dep[x] = dep[p] + 1; ind[dfn[x] = R[x] = ++tim] = x;
		for(auto y : G[x]) if(y ^ p) dfs(y, x), R[x] = tim, siz[x] += siz[y];
	}
	void solve() {
		n = in, m = in, Q = in; rep(i, 2, n) { int u = in, v = in; G[u].eb(v); G[v].eb(u); }
		dfs(1, 0); rep(k, 1, K) rep(i, 1, n) fa[k][i] = fa[k - 1][fa[k - 1][i]];
		rep(x, 1, tim) rt[x] = rt[x - 1], seg :: ins(rt[x], ind[x]);
	}
	int getid(int x, int pos) { return seg :: qkth(rt[dfn[x] - 1], rt[R[x]], pos); }
	int lca(int x, int y) { 
		if(dep[x] < dep[y]) swap(x, y); 
		per(i, K, 0) if(dep[fa[i][x]] >= dep[y]) x = fa[i][x];
		if(x == y) return x; 
		per(i, K, 0) if(fa[i][x] ^ fa[i][y]) x = fa[i][x], y = fa[i][y]; 
		return fa[0][x];
	}
}

int dep[N], ndn, fa[K + 1][N], rt[N], rtid[N], tfaid[N];
ll tdep[N], L[N], R[N], faid[N]; // faid : in the new tree, tfaid : in the ori tree.

int bel(ll x) { return upper_bound(L + 1, L + ndn + 1, x) - L - 1; }
int id(int bel, ll x) { return ori :: getid(rtid[bel], x - L[bel] + 1); }
ll getdep(ll x) { int tid = bel(x); return tdep[tid] + ori :: dep[id(tid, x)] - ori :: dep[rtid[tid]]; }
pii rlca(int x, int y) {
	per(i, K, 0) if(dep[fa[i][x]] > dep[y]) x = fa[i][x];
	if(fa[0][x] == y) return { x, y }; if(dep[x] != dep[y]) x = fa[0][x];
	per(i, K, 0) if(fa[i][x] ^ fa[i][y]) x = fa[i][x], y = fa[i][y]; 
	return { x, y };
}
int lca(ll x, ll y) {
	x = bel(x); y = bel(y); if(dep[x] < dep[y]) swap(x, y); 
	per(i, K, 0) if(dep[fa[i][x]] >= dep[y]) x = fa[i][x];
 	if(x == y) return x; per(i, K, 0) if(fa[i][x] ^ fa[i][y]) x = fa[i][x], y = fa[i][y]; 
	return fa[0][x];
}
int tlca(ll x, ll y) {
	int bx = bel(x), by = bel(y);
	if(bx == by) return ori :: lca(id(bx, x), id(by, y));
	if(dep[bx] < dep[by]) swap(bx, by), swap(x, y); pii t = rlca(bx, by);
	if(by == t.se && fa[0][t.fi] == t.se) return ori :: lca(tfaid[t.fi], id(by, y));
	else return ori :: lca(tfaid[t.fi], tfaid[t.se]);
}
ll getdep(ll x, ll y) { int t = lca(x, y); return tdep[t] + ori :: dep[tlca(x, y)] - ori :: dep[rtid[t]]; }
ll dist(ll x, ll y) { return getdep(x) + getdep(y) - 2 * getdep(x, y); }

int main() {
#ifndef ONLINE_JUDGE
	freopen("1.in", "r", stdin); freopen("P3248.out", "w", stdout);
#endif
	ori :: solve(); faid[1] = tfaid[1] = 0; ndn = rtid[1] = L[1] = tdep[1] = dep[1] = 1; R[1] = n;
	while(m--) {
		int x = in; ll vid = lin; ++ndn;
		L[ndn] = R[ndn - 1] + 1; R[ndn] = L[ndn] + ori :: siz[x] - 1;
		fa[0][ndn] = bel(vid); dep[ndn] = dep[fa[0][ndn]] + 1; tdep[ndn] = getdep(vid) + 1;
		rtid[ndn] = x; faid[ndn] = vid; tfaid[ndn] = id(fa[0][ndn], vid);	
		rep(k, 1, K) fa[k][ndn] = fa[k - 1][fa[k - 1][ndn]]; 
	} 
	while(Q--) { ll x = lin, y = lin; printf("%lld\n", dist(x, y)); }
	return 0;
}
